import axios from 'axios';
import Vue from 'vue';
// 请求超时时间
axios.defaults.timeout = 300000;
// post请求头
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
// 请求拦截器
axios.interceptors.request.use(
  config => {
    return config;
  },
  error => {
    return Promise.error(error);
  });
// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      if (response.data.returnCode < 0) {
        Vue.prototype.$alert(response.data.returnMsg,'警告',{
          type: 'warning'
        });
        return Promise.reject(response);
      } else {
        return Promise.resolve(response);
      }
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 404请求不存在
        case 404:
          Vue.prototype.$alert(`${error.response.config.url} 网络请求不存在`,'警告',{
            type: 'warning'
          });
          break;
        default:
          Vue.prototype.$alert(error.response.data.returnMsg,'警告',{
            type: 'warning'
          });
      }
    } else {
      Vue.prototype.$alert(`${error.response.config.url} 网络请求超时！`,'警告',{
        type: 'warning'
      });
    }
    return Promise.reject(error);
  }
);
export default {
  /**
   * get方法，对应get请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   * @param {Boolean} loadingFlag [是否需要显示遮罩层]
   * @param {Object} headers  请求相关参数设置
   */
  get(url, params, loadingFlag=true, headers) {
    headers = headers || {
      authorization:window.sessionStorage.getItem("token")
    };
    let loadingInstance = '';
    /* 如果 loadingFlag 为对象将赋值给 requestObj */
    if (typeof loadingFlag == 'object') {
      headers = loadingFlag;
      loadingFlag = false;
    }
    if (loadingFlag) {
      loadingInstance = Vue.prototype.$loading({
        lock: true,
        text: '请求处理中',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
    }
    return new Promise((resolve, reject) => {
      axios.get(url, {
          params: params,
          headers: headers
        })
        .then(res => {
          if (loadingInstance != '') {
            loadingInstance.close();
          }
          resolve(res.data);
        })
        .catch(err => {
          if (loadingInstance != '') {
            loadingInstance.close();
          }
          reject(err.data);
        });
    });
  },
  /**
   * post方法，对应post请求
   * @param {String} url [请求的url地址]
   * @param {Object} params [请求时携带的参数]
   * @param {Boolean} loadingFlag [是否需要显示遮罩层]
   * @param {Object} headers  请求相关参数设置
   */
  post(url, params, loadingFlag=true, headers) {
    headers = headers || {
      authorization:window.sessionStorage.getItem("token")
    };
    console.log(headers)
    let loadingInstance = '';
    /* 如果 loadingFlag 为对象将赋值给 requestObj */
    if (typeof loadingFlag == 'object') {
      headers = loadingFlag;
      loadingFlag = false;
    }
    if (loadingFlag) {
      loadingInstance = Vue.prototype.$loading({
        lock: true,
        text: '请求处理中',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
    }
    return new Promise((resolve, reject) => {
      axios.post(url, params, {
          headers: headers
        })
        .then(res => {
          if (loadingInstance != '') {
            loadingInstance.close();
          }
          resolve(res.data);
        })
        .catch(err => {
          if (loadingInstance != '') {
            loadingInstance.close();
          }
          reject(err.data);
        });
    });
  },
  /**
   * 保存数据
   * @param {*} tableName 表物理名
   * @param {*} data 要保存的form数据
   * @param {*} loadingFlag 是否显示加载，默认true
   */
  add(sysName,tableName,data,loadingFlag=true){
    return this.post(`/api/add/${sysName}/${tableName}`,data,loadingFlag)
  },
  /**
   * 保存数据
   * @param {*} tableName 表物理名
   * @param {*} data 要保存的form数据
   * @param {*} loadingFlag 是否显示加载，默认true
   */
  edit(sysName,tableName,data,loadingFlag=true){
    return this.post(`/api/edit${sysName}/${tableName}`,data,loadingFlag)
  },
  /**
   * 删除数据
   * @param {*} tableName 表物理名
   * @param {*} ids 数组或字符串，需要删除的id列表
   * @param {*} loadingFlag 是否显示加载，默认true
   */
  remove(sysName,tableName,ids,loadingFlag=true){
    return this.post(`/api/delete/${sysName}/${tableName}`,{id:ids},loadingFlag)
  },
  /**
   * 查询并返回分页数据列表
   * @param {*} sysName 系统名
   * @param {*} tableName 表物理名
   * @param {*} where 查询条件的form数据
   * @param {*} loadingFlag 是否显示加载，默认true
   */
  find(sysName,tableName,where={},loadingFlag=true){
    return this.post(`/api/get/${sysName}/${tableName}`,where,loadingFlag)
  },
  /**
   * 查询并返回符合条件的全部数据列表
   * @param {*} sysName 系统名
   * @param {*} tableName 表物理名
   * @param {*} where 查询条件的form数据
   * @param {*} loadingFlag 是否显示加载，默认true
   */
  findAll(sysName,tableName,where={},loadingFlag=true){
    return this.post(`/api/getAll/${sysName}/${tableName}`,where,loadingFlag)
  },
  /**
   * 根据条件返回数据库记录对象
   * @param {*} tableName 表物理名
   * @param {*} data 唯一条记录
   * @param {*} loadingFlag 是否显示加载，默认true
   */
  findOne(sysName,tableName,where={},loadingFlag=true){
    return this.post(`/api/getOne/${sysName}/${tableName}`,where,loadingFlag)
  },
  /**
   * 根据ID返回数据库记录对象
   * @param {*} tableName 表物理名
   * @param {*} id 记录唯一id
   * @param {*} loadingFlag 是否显示加载，默认true
   */
  findById(sysName,tableName,id,loadingFlag=true){
    return this.post(`/api/getOne/${sysName}/${tableName}`,{id},loadingFlag)
  },
  uploadImg(file){
    let data = new FormData()
    file.forEach(file => {
      data.append('file',file)
    });
    return this.post(`/api/meta/upload/img`,data,true,{'Content-Type':'multipart/form-data'})
  },
  uploadAudio(file,time){
    let data = new FormData()
    file.lastModifiedDate = new Date()
    file.name="audio.wav"
    data.append('file',file)
    data.append('time',time)
    return this.post(`/api/meta/upload/audio`,data,true,{'Content-Type':'multipart/form-data'})
  },
  uploadVideo(file){
    let data = new FormData()
    file.forEach(file => {
      data.append('file',file)
    });
    return this.post(`/api/meta/upload/video`,data,true,{'Content-Type':'multipart/form-data'})
  },
  uploadFile(file){
    let data = new FormData()
    file.forEach(file => {
      data.append('file',file)
    });
    return this.post(`/api/meta/upload/file`,data,true,{'Content-Type':'multipart/form-data'})
  }
};